home *** CD-ROM | disk | FTP | other *** search
/ TeX 1995 July / TeX CD-ROM July 1995 (Disc 1)(Walnut Creek)(1995).ISO / macros / latex209 / contrib / picins / picins.doc < prev    next >
Text File  |  1992-09-26  |  33KB  |  867 lines

  1. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  2. %    Autor:    Joachim Bleser                             %
  3. %        TH Darmstadt -- Hochschulrechenzentrum                 %
  4. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  5. %                                         %
  6. %    History:                                 %
  7. %                                         %
  8. %    Version 1.0                                 %
  9. %    Definition von \PARPIC un \HPIC                      %
  10. %                                         %
  11. %    Version 1.1  (7.3.90)                             %
  12. %    Korrektur des \PICCHANGEMODUS                         %
  13. %    Einfuehrung einer Option DASH und OVAL fuer \PARPIC und \HPIC         %
  14. %                                         %
  15. %    Version 1.2  (12.3.90)                             %
  16. %    Neue Umgebungen OVALENV und DASHENV                     %
  17. %    Dokumentation innerhalb der .STY-Datei                     %
  18. %    Korrektur der Umgebungen SHADOWENV und FRAMEENV              %
  19. %                                         %
  20. %    Version 1.3  (2.5.90)                             %
  21. %    Korrektur der DASH Option von \PARPIC und \DASHENV-Umgebung         %
  22. %                                         %
  23. %    Version 1.4  (3.8.90)                             %
  24. %    Ueberarbeitung aller Optionen von \PARPIC und \HPIC             %
  25. %    Neue Befehle :    \PICCAPTION                         %
  26. %            \PICHSKIP                         %
  27. %                                         %
  28. %    Version 1.4  (Dez.90 - Jan.91)                         %
  29. %    Dokumentation des .sty-Files                         %
  30. %                                         %
  31. %    Version 2.0  (Juni 91)                             %
  32. %    Ueberarbeitung und Umstrukturierung von \PARPIC und \HPIC         %
  33. %    Einfuehrung einer Option BOX fuer \PARPIC und \HPIC             %
  34. %    Einfuehrung eines Positionsparameters fuer \PARPIC und \HPIC         %
  35. %                                         %
  36. %    Version 2.1  (November 91)                         %
  37. %    Korrektur des \X@PAR und des \PICSKIP Kommandos              %
  38. %                                         %
  39. %    Version 3.0  (Juli 92)                             %
  40. %    Erweiterung der Unterschriften-Funktionalitaet                 %
  41. %    Korrektur von \PARPIC                             %
  42. %    Korrektur von \X@PAR                             %
  43. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  44. %
  45. %    PICINS.STY enthaelt Kommandos, die die Integration von Bildern
  46. %    in Text unterstuetzen. Dies sind im Einzelnen:
  47. %
  48. %    \parpic   : Text umfliesst das Bild
  49. %    \hpic      : Bilder in einem eigenen Absatz
  50. %    \picskip  : beeinflusst das Umfliessen von Bildern durch Text
  51. %    \pichskip : horizontaler Abstand zwischen Bild und Text
  52. %    \shadowthickness: Schattendicke
  53. %    \dashlength: Laenge der Striche
  54. %    \boxlength:  Tiefe der Box
  55. %    \piccaption: Unterschrift unter/neben das Bild
  56. %    \newcaption: Erweitertes \caption-Kommando
  57. %    \picchangemode: steuert Bildplazierung
  58. %
  59. %    Weiterhin werden vier neue Umgebungen definiert:
  60. %    frameenv : Umrahmt den Inhalt
  61. %    shadowenv: Umrahmt den Inhalt und schattiert den Rahmen
  62. %    ovalenv  : Umrahmt den Inhalt mit abgerundeten Ecken
  63. %    dashenv  : Umrahmt den Inhalt mit einem gestrichelten Rahmen
  64. %
  65. %
  66. \message{Option `picins' Version 3.0  Sep. 1992, TH Darmstadt/HRZ}
  67. %    Deklaration der benoetigten 'Variablen'
  68. %    Alle Variablen, die mit \d@... anfangen, enthalten Dimensionen,
  69. %    und alle Variablen, die mit \c@... anfangen, enthalten Counts
  70. \newbox\@BILD%          eine BOX zur Aufnahme des Bildinhalts
  71. \newbox\@TEXT%          und eine Box fuer die (optionale) Unterschrift
  72. \newdimen\d@breite%      Bildbreite
  73. \newdimen\d@hoehe%      Bildhoehe
  74. \newdimen\d@xoff%      Offset in x-Richtung
  75. \newdimen\d@yoff%      Offset in y-Richtung
  76. \newdimen\d@shad%      Schattendicke
  77. \newdimen\d@dash%      Strichlaenge
  78. \newdimen\d@boxl%      Boxlaenge (bzw. -tiefe)
  79. \newdimen\d@pichskip%      Raum zwischen Bild und Text bei \PARPIC
  80. \newdimen\d@tmp
  81. \newdimen\d@tmpa
  82. \newdimen\d@bskip
  83. \newdimen\hsiz@%    Variable fuer original \hsize
  84. \newdimen\p@getot@l%    Variable fuer original \pagetotal
  85. \newcount\c@breite
  86. \newcount\c@hoehe
  87. \newcount\c@xoff
  88. \newcount\c@yoff
  89. \newcount\c@pos
  90. \newcount\c@shad
  91. \newcount\c@dash
  92. \newcount\c@boxl
  93. \newcount\c@zeilen%     Anzahl der einzurueckenden Zeilen bei \PARPIC
  94. \newcount\@changemode%     Flag fuer den \PICCHANGEMODE
  95. \newcount\c@piccaption%  Flag fuer Unterschrift unter/neben \parpic
  96. \newcount\c@piccaptionpos%  Wo soll die Unterschrift stehen?
  97. \newcount\c@picpos
  98. \newcount\c@whole%     Count fuer \@wholewidth  (Liniendicke)
  99. \newcount\c@half%     Haelfte von \C@WHOLE
  100. \newcount\c@tmp
  101. \newcount\c@tmpa
  102. \newcount\c@tmpb
  103. \newcount\c@tmpc
  104. \newcount\c@tmpd
  105. \newskip\d@leftskip
  106. \newif\if@list \@listfalse% TRUE, wenn \PARPIC innerhalb einer LIST-Umgebung
  107.               % verwendet wird
  108. \newif\if@offset%  TRUE, wenn bei \PARPIC oder \HPIC Offset angegeben wurden,
  109.         %  ansonsten FALSE
  110.  
  111.  
  112. %    Es folgen einige Voreinstellung (Defaults):
  113. \c@piccaptionpos=1%      Default Unterschrift unter Bild
  114. \c@picpos=0
  115. \d@shad=4pt%          Default fuer Schattendicke
  116. \d@dash=4pt%          Default fuer gestrichelte Rahmen
  117. \d@boxl=10pt%          Default fuer Boxtiefe
  118. \d@pichskip=1em%      Default fuer Abstand zwischen Bild und Text
  119. \@changemode=0%       Default kein Wechselmodus
  120. \def\@captype{figure}%      Default fuer \piccaptype
  121. \let\old@par=\par%      \PAR-Kommando wird gerettet
  122.  
  123. %    \pichskip steuert den horizontalen Abstand zwischen Bild und Text
  124. \def\pichskip#1{\d@pichskip #1\relax}
  125.  
  126.  
  127. %    \shadowthickness destimmt die Schattendicke   (Option [s])
  128. \def\shadowthickness#1{\d@shad #1\relax}
  129.  
  130.  
  131. %    \dashlength bestimmt die Strichlaenge          (Option [d])
  132. \def\dashlength#1{\d@dash #1\relax}
  133.  
  134.  
  135. %    \boxlength bestimmt die Boxtiefe          (Option [x])
  136. \def\boxlength#1{\d@boxl #1\relax}
  137.  
  138.  
  139. \def\picchangemode{\@changemode=1}%     Einschalter fuer den Wechselmode
  140. \def\nopicchangemode{\@changemode=0}%     Ausschalter fuer den Wechselmode
  141.  
  142.  
  143. \def\piccaptionoutside{\c@piccaptionpos=1}% Unterschrift unter dem Rahmen
  144. \def\piccaptioninside{\c@piccaptionpos=2}%  Unterschrift im Rahmen
  145. \def\piccaptionside{\c@piccaptionpos=3}%   Unterschrift rechts/links neben Bild
  146. \def\piccaptiontopside{\c@piccaptionpos=4}%Unterschrift rechts/links neben Bild
  147.  
  148. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  149. %  Der \piccaption-Befehl
  150. %  ======================
  151. %    Der \PICCAPTION-Befehl macht nichts anderes, als ein Makro mit
  152. %    der Kurzform und ein Makro mit der richtigen Unterschrift zu
  153. %    definieren. Die Auswertung dieser Makros erfolgt in \PARPIC.
  154. \def\piccaption{\@ifnextchar [{\@piccaption}{\@piccaption[]}}
  155. \def\@piccaption[#1]#2{\c@piccaption=1\def\sh@rtf@rm{#1}\def\capti@nt@xt{#2}}
  156. %    \MAKE@PICCAPTION verwendet das orginal LaTeX-Caption Kommando, um
  157. %    Unterschrift zu erzeugen. Es muss nur die Textbreite angepasst werden.
  158. \def\make@piccaption{%
  159.  \hsiz@\d@breite%        So breit darf die Unterschrift werden
  160.  \ifnum\c@piccaptionpos=2%    Abhaenig von der Postion, an der die
  161.    \advance\hsiz@ -2\fboxsep%    Unterschrift stehen soll, wird die Textbreite
  162.  \fi%                entsprechend korrigiert.
  163.  \ifnum\c@piccaptionpos>2%
  164.    \hsiz@\hsize\advance\hsiz@-\d@breite\advance\hsiz@-\d@pichskip%
  165.  \fi%
  166.  \setbox\@TEXT=\vbox{\hsize\hsiz@\caption[\sh@rtf@rm]{\capti@nt@xt}}%
  167. }
  168.  
  169.  
  170.  
  171. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  172. %  Der \newcaption-Befehl
  173. %  ======================
  174. %    Das \piccaption-Kommando entspricht weitgehend dem LaTeX
  175. %    \caption-Kommando aus dem LATEX.TEX-File
  176. %    Dieses Kommando bewirkt, dass der Unterschriftentext linksbuendig
  177. %    untereinander steht.
  178. \def\newcaption{\refstepcounter\@captype\@dblarg{\@newcaption\@captype}}
  179. \long\def\@newcaption#1[#2]#3{%
  180.   \old@par%
  181.   \addcontentsline{\csname ext@#1\endcsname }{#1}%
  182.     {\protect\numberline{\csname the#1\endcsname}{\ignorespaces #2}}
  183.   \begingroup\@parboxrestore\normalsize%
  184.     \@newmakecaption{\csname fnum@#1\endcsname}{\ignorespaces #3}\old@par%
  185.   \endgroup%
  186. }
  187. \long\def\@newmakecaption#1#2{%
  188.   \vskip 10pt%
  189.   \setbox\@tempboxa \hbox {#1: #2}%
  190.   \ifdim \wd\@tempboxa >\hsize% #1: #2\par%<-- So steht's im Orginal
  191.     \setbox0=\hbox{#1: }\dimen0=\hsize\advance\dimen0 by-\wd0
  192.     \setbox1=\vtop{\hsize=\dimen0 #2}
  193.     \hbox{\box0 \box1}
  194.     \par
  195.   \else \hbox to\hsize {\hfil \box \@tempboxa \hfil}
  196.   \fi
  197. }
  198.  
  199.  
  200.  
  201.  
  202.  
  203. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  204. %  Der \parpic-Befehl
  205. %  ==================
  206. %  Syntax:  \parpic(breite,hoehe)(x-off,y-off)[Optionen][Position]{Bildinhalt}
  207. %        ------------------------------------------------------------------
  208. %  \parpic positioniert ein Bild an den Anfang eines neuen Absatzes.
  209. %  Neben dem Bild steht Text (das Bild wird vom Text umflossen).
  210. %  Angegeben werden muss der Bildinhalt, alle anderen Angaben sind optional.
  211. %
  212. %  Vorgehensweise:
  213. %    Zuerst wird gefragt, ob die optionalen Parameter vorhanden sind
  214. %    Dem LaTeX-Befehl \@ifnextchar werden drei Parameter uebergeben:
  215. %      1. das Zeichen, das als naechstes erwartet wird
  216. %      2. die Aktion, die ausgefuehrt wird, wenn das Zeichen tatsaechlich
  217. %         erscheint
  218. %      3. die Aktion, die ausgefuehrt wird, wenn das Zeichen nicht erscheint
  219. %    Im dritten Fall werden Defaultwerte an die Aktion uebergeben.
  220. %
  221. %    Dann werden Bildhoehe und Bildbreite ermittelt. Wurden Offsets
  222. %    uebergeben, wird das Bild nach diesen Offsets positioniert, ansonsten
  223. %    wird nach Parameter #6 positioniert.
  224. %    Anschliessend werden die Umrahmnungsparameter ausgewertet.
  225. %    Nun wird berechnet, ob das Bild noch auf die aktuelle Seite passt,
  226. %    oder ob umgebrochen werden muss. Nun kann das Bild positioniert
  227. %    werden. Zuletzt wird die Anzahl der einzurueckenden Zeilen berechnet
  228. %    und das \par-Kommando fuer eigene Zwecke umdefiniert.
  229. %
  230. %    Es wird getestet, ob Bildbreite und Bildhoehe explizit angegeben wurden
  231. \def\parpic{%
  232.   \@ifnextchar ({\iparpic}{\iparpic(0pt,0pt)}
  233. }
  234. %    Es wird getestet, ob Offsets angeben wurden.
  235. \def\iparpic(#1,#2){%
  236.   \@ifnextchar ({\@offsettrue\iiparpic(#1,#2)}%
  237.         {\@offsetfalse\iiparpic(#1,#2)(0pt,0pt)}
  238. }
  239. %    Es wird getestet, ob Umrahmungsoptionen angegeben wurden. Wenn nicht,
  240. %    wird ein [l] (d.h. Bild auf die linke Seite) als Default uebergeben.
  241. \def\iiparpic(#1,#2)(#3,#4){%
  242.   \@ifnextchar [{\iiiparpic(#1,#2)(#3,#4)}{\iiiparpic(#1,#2)(#3,#4)[l]}
  243. }
  244. %    Es wird getestet, ob Positionsparameter angegeben wurden.
  245. \def\iiiparpic(#1,#2)(#3,#4)[#5]{%
  246.   \@ifnextchar [{\ivparpic(#1,#2)(#3,#4)[#5]}{\ivparpic(#1,#2)(#3,#4)[#5][]}
  247. }
  248. \def\ivparpic(#1,#2)(#3,#4)[#5][#6]#7{%
  249.  \let\par=\old@par\par%
  250.  \hangindent0pt\hangafter1%    Default Einstellungen vornehmen
  251.  \setbox\@BILD=\hbox{#7}%
  252.  \d@breite=#1\d@breite=\the\d@breite%        Die Bildbreite wird bestimmt
  253.  \ifdim\d@breite=0pt\d@breite=\wd\@BILD\fi%
  254.  \c@breite=\d@breite\divide\c@breite by65536%
  255.  \multiply\c@piccaption\c@piccaptionpos%
  256.  \d@hoehe=#2\d@hoehe=\the\d@hoehe%        Die Bildhoehe wird bestimmt
  257.  \ifdim\d@hoehe=0pt\d@hoehe=\ht\@BILD\advance\d@hoehe by\dp\@BILD\fi%
  258.  \c@hoehe=\d@hoehe\divide\c@hoehe by65536%
  259.  \d@xoff=#3\c@xoff=\d@xoff\divide\c@xoff by65536% Der x-Offset wird berechnet
  260.  \d@yoff=\d@hoehe%                  Der y-Offset wird berechnet
  261.  \advance\d@yoff by-#4\c@yoff=\d@yoff\divide\c@yoff by65536%
  262.  \c@pos=1\unitlength1pt%
  263.  \if@offset%    Bild wird nach den Offsets innerhalb der Rahmens positioniert
  264.    \setbox\@BILD=\hbox{%
  265.      \begin{picture}(\c@breite,\c@hoehe)%
  266.        \put(0,0){\makebox(\c@breite,\c@hoehe){}}%
  267.        \put(\c@xoff,\c@yoff){\box\@BILD}%
  268.      \end{picture}%
  269.    }%
  270.  \else%     Bild wird nach Parameter #6 positioniert
  271.    \setbox\@BILD=\hbox{%
  272.      \begin{picture}(\c@breite,\c@hoehe)%
  273.        \put(0,0){\makebox(\c@breite,\c@hoehe)[#6]{\box\@BILD}}%
  274.      \end{picture}%
  275.    }%
  276.  \fi%
  277.  \ifnum\c@piccaption=2%   Unterschrift in den Rahmen, unterhalb des Bildes.
  278.    \make@piccaption%      Unterschrift erzeugen.
  279.    \advance\d@hoehe\ht\@TEXT\advance\d@hoehe\dp\@TEXT%    'Bild'hoehe korrigieren
  280.    \c@hoehe=\d@hoehe\divide\c@hoehe by65536%
  281.    \setbox\@BILD=\vbox{\box\@BILD\vspace{-5pt}%
  282.                \hbox{\hspace{\fboxsep}\box\@TEXT}%
  283.                \vspace{4pt}}%
  284.  \fi%
  285. %    Nun werden die Umrahmungsparameter ausgewertet
  286.  \@tfor\@tempa := #5\do{%
  287.    \if\@tempa f\setbox\@BILD=\hbox{\Rahmen(\c@breite,\c@hoehe){\box\@BILD}}\fi%
  288.    \if\@tempa s\setbox\@BILD=\hbox{\Schatten(\c@breite,\c@hoehe){\box\@BILD}}\fi%
  289.    \if\@tempa o\setbox\@BILD=\hbox{\Oval(\c@breite,\c@hoehe){\box\@BILD}}\fi%
  290.    \if\@tempa d\setbox\@BILD=\hbox{\Strich(\c@breite,\c@hoehe){\box\@BILD}}\fi%
  291.    \if\@tempa x\setbox\@BILD=\hbox{\Kasten(\c@breite,\c@hoehe){\box\@BILD}}\fi%
  292.    \if\@tempa l\c@pos=1\fi%
  293.    \if\@tempa r\c@pos=2\fi%
  294.  }%
  295.  \ifnum\c@piccaption=1%   Unterschrift unterhalb des Rahmens
  296.    \make@piccaption%      Unterschrift erzeugen.
  297.    \advance\d@hoehe\ht\@TEXT\advance\d@hoehe\dp\@TEXT%
  298.    \c@hoehe=\d@hoehe\divide\c@hoehe by65536%    'Bild'-hoehe korrigieren.
  299.    \setbox\@BILD=\vbox{\box\@BILD\vspace{-5pt}\hbox{\box\@TEXT}\vspace{4pt}}%
  300.  \fi%
  301.  \ifodd\count0\c@picpos=0\else\c@picpos=\@changemode\fi%
  302. %    Wenn der verbleibende vertikale Platz auf der Seite fuer das Bild
  303. %    nicht mehr ausreicht, wird ein Seitenumbruch erzwungen.
  304.  \pagetotal=\the\pagetotal%
  305.  \d@tmp=\pagegoal\advance\d@tmp by-\pagetotal\advance\d@tmp by-\baselineskip%
  306.  \ifdim\d@hoehe>\d@tmp%
  307.    \vskip 0pt plus\d@hoehe\relax\pagebreak[3]\vskip 0pt plus-\d@hoehe\relax%
  308.    \ifnum\c@picpos=1\c@picpos=0\else\c@picpos=\@changemode\fi%
  309.  \fi%
  310.  \ifnum\c@picpos=1\ifnum\c@pos=1\c@pos=2\else\c@pos=1\fi\fi%
  311. %    Wird \parpic innerhalb einer LIST-Umgebung verwendet (\@listdepth>0),
  312. %    muessen besondere Vorkehrungen getroffen werden.
  313.  \ifnum\@listdepth>0
  314.    \@listtrue\parshape 0%
  315.    \advance\hsize -\rightmargin%
  316.    \d@leftskip \leftskip%
  317.    \leftskip \@totalleftmargin%
  318.    \if@inlabel\rule{\linewidth}{0pt}\vskip-\baselineskip\relax\fi%
  319.  \else\@listfalse\medskip%
  320.  \fi%
  321. %    Soll das Bild auf der rechten Seite positioniert werden, muss der
  322. %    Betrag der Einrueckung berechnet werden.
  323. %        einrueck := akt_textbreite - bildbreite
  324.  \if@list\d@tmpa=\linewidth\else\d@tmpa=\hsize\fi%
  325.  \ifnum\c@piccaption=3%   Unterschrift soll neben das Bild, vertikal zentriert
  326.    \make@piccaption%
  327.    \d@tmp\ht\@TEXT\advance\d@tmp\dp\@TEXT%
  328.    \ifdim\d@hoehe>\d@tmp%
  329.      \setbox\@TEXT=\vbox to\d@hoehe{\vfill\box\@TEXT\vspace{.2\baselineskip}\vfill}%
  330.    \else%
  331.      \setbox\@BILD=\vbox to\d@tmp{\vfill\box\@BILD\vfill}%
  332.      \d@hoehe\d@tmp%
  333.    \fi%
  334.  \fi%
  335.  \ifnum\c@piccaption=4%   Unterschrift soll neben das Bild auf gleiche Hoehe
  336.    \make@piccaption%
  337.    \d@tmp\ht\@TEXT\advance\d@tmp\dp\@TEXT%\advance\d@tmp-10pt%
  338.    \setbox\@TEXT=\vbox to\d@hoehe{\vspace{-10pt}\box\@TEXT\vfil}%
  339.    \advance\d@hoehe-\d@tmp%
  340.  \fi%
  341.  \ifnum\c@pos=1\d@tmpa=0pt%
  342.    \ifnum\c@piccaption>2%   Unterschrift soll neben das Bild
  343.       \setbox\@BILD=\hbox{\box\@BILD\hspace{\d@pichskip}\hbox{\box\@TEXT}}%
  344.    \fi%
  345.  \else\advance\d@tmpa by-\wd\@BILD\d@breite=-\d@breite%
  346.    \ifnum\c@piccaption>2%   Unterschrift soll neben das Bild
  347.       \d@tmpa=0pt%
  348.       \setbox\@BILD=\hbox{\hbox{\box\@TEXT}\hspace{\d@pichskip}\box\@BILD}%
  349.    \fi%
  350.  \fi%
  351. %    Um den Wert von \d@bskip wird nach der Bildplazierung wieder
  352. %    nach oben zurueckgesprungen. Der Wert  .3\baselineskip wurde
  353. %    empirisch ermittelt.
  354.  \p@getot@l\the\pagetotal%
  355.  \d@bskip\d@hoehe\advance\d@bskip by\parskip\advance\d@bskip by.3\baselineskip%
  356. %    Nun wird das Bild (evt. eingerueckt und) positioniert.
  357.  {\noindent\hspace*{\d@tmpa}\relax%
  358.   \box\@BILD\nopagebreak\vskip-\d@bskip\relax\nopagebreak}%
  359. %    Aus der Bildhoehe berechnet sich die Anzahl der einzurueckenden Zeilen.
  360. %        zeilen := bildhoehe / baselineskip
  361.  \d@tmp=-\d@hoehe\divide\d@tmp by\baselineskip%
  362.  \c@zeilen=\d@tmp\advance\c@zeilen by-1%
  363.  \ifdim\d@breite<0pt\advance\d@breite by-\d@pichskip%
  364.  \else\advance\d@breite by\d@pichskip%
  365.  \fi%
  366.  \hangindent=\d@breite%     Der Bertag der Einrueckung.
  367.  \hangafter=\c@zeilen%        Die Anzahl der einzurueckenden Zeilen.
  368. %    Die Bedeutung des \par-Kommandos wird gerettet; anschliessend wird
  369. %    \par umdefiniert.
  370.  \let\par=\x@par%
  371.  \ifnum\c@piccaption=3%     In diesem Fall steht kein weiterer Text neben
  372.     \hangindent0pt\hangafter1\let\par=\old@par%  dem Bild ==> vskip
  373.     \vskip\d@hoehe\vskip.2\baselineskip%
  374.  \fi%
  375.  \c@piccaption=0%    Das Unterschriftenflag wird wieder geloescht
  376. }
  377.  
  378.  
  379.  
  380.  
  381. \newdimen\ptoti
  382. \newdimen\ptotii
  383. %  Das \x@par-Makro
  384. %  ----------------
  385. %  Das \x@par-Makro ersetzt solange das aktuelle \par-Kommando, solange noch
  386. %  Zeilen einzuruecken sind; anschliessend erhaelt das \par-Kommando seine
  387. %  alte Bedeutung zurueck.
  388. \def\x@par{%
  389.  \ptoti\pagetotal%        Hoehe VOR dem \par-Kommando.
  390.  \old@par%            \old@par entspricht dem aktuellen \par
  391.  \ptotii\pagetotal%        Hoehe NACH dem \par-Kommando.
  392.  \ifdim\ptoti=\ptotii%        Der Absatz enthaelt KEINE Zeile (ist leer).
  393.    \d@tmp\d@hoehe%
  394.  \else%             Der Absatz enthaelt mindestens eine Zeile.
  395.    \d@tmp\baselineskip%     Die Hoehe des vorangehenden Absatzes
  396.    \multiply\d@tmp by\prevgraf% wird aus der Anzahl Zeilen des Absatzes
  397.    \advance\d@tmp by\parskip%    berechnet
  398.    \global\advance\d@hoehe by-\d@tmp\d@tmp=\d@hoehe%
  399.  \fi%
  400. %  Wenn die verbleibende Bildhoehe > 0pt ist, muessen noch mehr Zeilen
  401. %  eingerueckt werden.
  402.  \ifdim\d@hoehe>0pt%
  403.    \divide\d@tmp by\baselineskip\c@zeilen=-\d@tmp\advance\c@zeilen by-1%
  404.    \c@zeilen=\the\c@zeilen%      Um Aenderung nach aussen sichtbar zu machen
  405.  \else\c@zeilen=0
  406.  \fi
  407.  \ifnum\c@zeilen<0\hangafter=\c@zeilen\hangindent=\d@breite%
  408.  \else\let\par=\old@par%
  409.    \hangindent 0pt%
  410.    \leftskip \d@leftskip%
  411.    \if@list\parshape \@ne \@totalleftmargin \linewidth%
  412.      \advance\hsize \rightmargin%
  413.    \fi%
  414.  \fi%
  415. }
  416.  
  417.  
  418. %   Das \picskip-Makro
  419. %   ------------------
  420. %   Mit dem \picskip-Kommando kann die Anzahl der einzurueckenden Zeilen
  421. %   beeinflusst werden. Als Parameter wird die gewuenschte Anzahl von
  422. %   einzurueckenden Zeilen uebergeben. Ist diese 0, wird der verbleibende
  423. %   Platz neben dem Bild uebersprungen (\vspace*{\d@hoehe}) und der
  424. %   Text wird unterhalb des Bildes fortgesetzt.
  425. %
  426. \def\picskip#1{%
  427.  \let\par=\old@par%
  428.  \par%
  429.  \pagetotal\the\pagetotal%
  430.  \c@tmp=#1\relax%
  431.  \ifnum\c@tmp=0%    Sprung ueber den verbleibenden Zwischenraum hinweg
  432.    \d@tmp\baselineskip\multiply\d@tmp by\prevgraf\advance\d@tmp\parskip%
  433.    \ifdim\p@getot@l<\pagetotal
  434.      \advance\d@hoehe by-\d@tmp\advance\d@hoehe by1ex%
  435.      \ifdim\d@hoehe>0pt\vspace*{\d@hoehe}\fi%
  436.    \fi%
  437.    \ifdim\p@getot@l=\pagetotal%     Test auf Leerzeile
  438.      \advance\d@hoehe by-\d@tmp\advance\d@hoehe by1ex%
  439.      \ifdim\d@hoehe>0pt\vspace*{\d@hoehe}\fi%
  440.    \fi%
  441.  \else\hangafter=-\c@tmp\hangindent=\d@breite%
  442.  \fi%
  443.  \leftskip \d@leftskip%
  444. %  Wurde \PARPIC innerhalb einer LIST-Umgebung verwendet, so wird nun
  445. %  \parshape wieder gesetzt.
  446.  \if@list\parshape \@ne \@totalleftmargin \linewidth%
  447.    \advance\hsize \rightmargin%
  448.  \fi%
  449. }
  450.  
  451.  
  452.  
  453.  
  454.  
  455.  
  456. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  457. %  Der \hpic-Befehl
  458. %  ================
  459. %  Syntax:  \hpic(breite,hoehe)(x-off,y-off)[Optionen][Position]{Bildinhalt}
  460. %        ------------------------------------------------------------
  461. %  \hpic ermoeglicht das komfortable Positionieren von Bilder in einem
  462. %  eigenen Absatz; d.h. Text neben dem Bild ist nicht moeglich.
  463. %
  464. %  Vorgehensweise:
  465. %    Zuerst werden Bildbreite und Bildhoehe sowie die Offsets bestimmt.
  466. %    Wurden Offsets uebergeben, wird das Bild nach Vorgabe positioniert,
  467. %    ansonsten nach Paramter #6. Anschliessend werden die Umrahmungs-
  468. %    parameter ausgewertet. Zuletzt wird das Bild in eine \parbox
  469. %    positioniert.
  470. %
  471. %    Es wird getestet, ob Bildbreite und Bildhoehe explizit angegeben wurden
  472. \def\hpic{%
  473.   \@ifnextchar ({\ihpic}{\ihpic(0pt,0pt)}
  474. }
  475. %    Es wird getestet, ob Offsets angegeben wurden
  476. \def\ihpic(#1,#2){%
  477.   \@ifnextchar ({\@offsettrue\iihpic(#1,#2)}%
  478.         {\@offsetfalse\iihpic(#1,#2)(0pt,0pt)}
  479. }
  480. %    Es wird getestet, ob Umrahmungsoptionen angegeben wurden. Wenn nicht,
  481. %    wird ein [l] (d.h. Bild auf die linke Seite) als Default uebergeben.
  482. \def\iihpic(#1,#2)(#3,#4){%
  483.   \@ifnextchar [{\iiihpic(#1,#2)(#3,#4)}{\iiihpic(#1,#2)(#3,#4)[l]}
  484. }
  485. %    Es wird getestet, ob Positionsparameter angegeben wurden
  486. \def\iiihpic(#1,#2)(#3,#4)[#5]{%
  487.   \@ifnextchar [{\ivhpic(#1,#2)(#3,#4)[#5]}{\ivhpic(#1,#2)(#3,#4)[#5][]}
  488. }
  489. \def\ivhpic(#1,#2)(#3,#4)[#5][#6]#7{%
  490.   \setbox\@BILD=\hbox{#7}%
  491.   \d@breite=#1\d@breite=\the\d@breite%
  492.   \ifdim\d@breite=0pt\d@breite=\wd\@BILD\fi%
  493.   \c@breite=\d@breite\divide\c@breite by65536%
  494.   \d@hoehe=#2\d@hoehe=\the\d@hoehe%
  495.   \ifdim\d@hoehe=0pt\d@hoehe=\ht\@BILD\advance\d@hoehe by\dp\@BILD\fi%
  496.   \c@hoehe=\d@hoehe\divide\c@hoehe by65536%
  497.   \d@xoff=#3\c@xoff=\d@xoff\divide\c@xoff by65536%
  498.   \d@yoff=\d@hoehe%
  499.   \advance\d@yoff by-#4\c@yoff=\d@yoff\divide\c@yoff by65536%
  500.   \c@pos=0\d@tmpa=\parindent\parindent=0pt\unitlength1pt%
  501.   \if@offset
  502.     \setbox\@BILD=\hbox{%
  503.       \begin{picture}(\c@breite,\c@hoehe)%
  504.     \put(0,0){\makebox(\c@breite,\c@hoehe){}}%
  505.     \put(\c@xoff,\c@yoff){\box\@BILD}%
  506.       \end{picture}%
  507.     }%
  508.   \else%              Bild wird nach Parameter #6 positioniert
  509.     \setbox\@BILD=\hbox{%
  510.       \begin{picture}(\c@breite,\c@hoehe)%
  511.     \put(0,0){\makebox(\c@breite,\c@hoehe)[#6]{\box\@BILD}}%
  512.       \end{picture}%
  513.     }%
  514.   \fi%
  515.   \@tfor\@tempa := #5\do{%
  516.     \if\@tempa f\setbox\@BILD=\hbox{\Rahmen(\c@breite,\c@hoehe){\box\@BILD}}\fi%
  517.     \if\@tempa s\setbox\@BILD=\hbox{\Schatten(\c@breite,\c@hoehe){\box\@BILD}}\fi%
  518.     \if\@tempa o\setbox\@BILD=\hbox{\Oval(\c@breite,\c@hoehe){\box\@BILD}}\fi%
  519.     \if\@tempa d\setbox\@BILD=\hbox{\Strich(\c@breite,\c@hoehe){\box\@BILD}}\fi%
  520.     \if\@tempa x\setbox\@BILD=\hbox{\Kasten(\c@breite,\c@hoehe){\box\@BILD}}\fi%
  521.     \if\@tempa t\c@pos=1\fi%
  522.     \if\@tempa b\c@pos=2\fi%
  523.   }%
  524.  \ifnum\c@pos=0\parbox{\d@breite}{\makebox[0cm]{}\\\box\@BILD\smallskip}\fi%
  525.  \ifnum\c@pos=1\parbox[t]{\d@breite}{\makebox[0cm]{}\\\box\@BILD\smallskip}\fi%
  526.  \ifnum\c@pos=2\parbox[b]{\d@breite}{\makebox[0cm]{}\\\box\@BILD\smallskip}\fi%
  527.  \parindent=\d@tmpa%
  528. }
  529.  
  530.  
  531.  
  532.  
  533.  
  534. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  535. %    ===============
  536. %    Die Hilfsmakros
  537. %    ===============
  538. %    Die nun folgenden Makros sind nicht fuer die Verwendung
  539. %    in einem Dokument geeignet. Sie dienen den oben definierten
  540. %    'Hauptmakros' zur Unterstuetzung.
  541.  
  542. %  Das \Rahmen-Makro
  543. %  -----------------
  544. %  Mit diesem Makro wird mittels der \picture-Umgebung ein Rahmen um das
  545. %  Bild gezeichnet  ==> \framebox
  546. %  Parameter:
  547. %    #1,#2:    Breite und Hoehe in Punkten
  548. %    #3   :    Bildinhalt
  549. %  Die Breite und Hoehe des Bildes werden zuletzt um zweimal Liniendicke
  550. %  erhoeht.
  551. \def\Rahmen(#1,#2)#3{%
  552.   \c@whole=\@wholewidth\divide\c@whole by65536%
  553.   \c@half=\@halfwidth\divide\c@half by65536%
  554.   \c@tmpa=#1\advance\c@tmpa by\c@whole\advance\c@tmpa by\c@whole%
  555.   \c@tmpb=#2\advance\c@tmpb by\c@whole\advance\c@tmpb by\c@whole%
  556.   \begin{picture}(\c@tmpa,\c@tmpb)%
  557.     \put(\c@whole,\c@half){\framebox(#1,#2){#3}}%
  558.   \end{picture}%
  559.   \global\advance\d@breite by2\@wholewidth%
  560.   \global\advance\d@hoehe by2\@wholewidth%
  561. }
  562.  
  563.  
  564. %  Das \Schatten-Makro
  565. %  -----------------
  566. %  Mit diesem Makro wird mittels der \picture-Umgebung ein Rahmen und ein
  567. %  Schatten um das Bild gezeichnet  ==> \framebox + 2 \rule
  568. %  Parameter:
  569. %    #1,#2:    Breite und Hoehe in Punkten
  570. %    #3   :    Bildinhalt
  571. %  Die Breite und Hoehe des Bildes werden zuletzt um zweimal Liniendicke
  572. %  und einmal Schattendicke erhoeht.
  573. \def\Schatten(#1,#2)#3{%
  574.   \c@whole=\@wholewidth\divide\c@whole by65536%
  575.   \c@half=\@halfwidth\divide\c@half by65536%
  576.   \c@shad=\d@shad\divide\c@shad by65536%
  577.   \c@tmp=\c@whole\advance\c@tmp by\c@whole\c@tmpd=\c@tmp%
  578.   \advance\c@tmp by\c@shad%
  579.   \advance\c@tmpd by#1%
  580.   \advance\c@half by\c@shad%
  581.   \c@tmpa=#1\advance\c@tmpa by\c@tmp%
  582.   \c@tmpb=#2\advance\c@tmpb by\c@tmp%
  583.   \begin{picture}(\c@tmpa,\c@tmpb)%
  584.     \put(\c@whole,\c@half){\framebox(#1,#2){#3}}%
  585.     \put(\c@shad,0){\rule{\c@tmpd pt}{\c@shad pt}}%
  586.     \put(\c@tmpd,0){\rule{\c@shad pt}{#2 pt}}%
  587.   \end{picture}%
  588.   \global\advance\d@breite by2\@wholewidth\global\advance\d@breite by\d@shad%
  589.   \global\advance\d@hoehe by2\@wholewidth\global\advance\d@hoehe by\d@shad%
  590. }
  591.  
  592.  
  593. %  Das \Oval-Makro
  594. %  -----------------
  595. %  Mit diesem Makro wird mittels der \picture-Umgebung ein runder Rahmen um das
  596. %  Bild gezeichnet  ==> \oval
  597. %  Parameter:
  598. %    #1,#2:    Breite und Hoehe in Punkten
  599. %    #3   :    Bildinhalt
  600. \def\Oval(#1,#2)#3{%
  601.   \@wholewidth=0.4pt%
  602.   \c@tmpa=\the#1\divide\c@tmpa by2%
  603.   \c@tmpb=\the#2\divide\c@tmpb by2%
  604.   \begin{picture}(#1,#2)%
  605.     \put(\c@tmpa,\c@tmpb){\oval(#1,#2)}%
  606.     \put(0.4,0.4){#3}%
  607.   \end{picture}%
  608.   \global\advance\d@breite by1pt\global\advance\d@hoehe by1pt%
  609. }
  610.  
  611.  
  612. %  Das \Strich-Makro
  613. %  -----------------
  614. %  Mit diesem Makro wird mittels der \picture-Umgebung ein gestrichelter Rahmen
  615. %  um das Bild gezeichnet  ==> \dashbox
  616. %  Parameter:
  617. %    #1,#2:    Breite und Hoehe in Punkten
  618. %    #3   :    Bildinhalt
  619. %  Die Breite und Hoehe des Bildes werden zuletzt um zweimal Liniendicke
  620. %  erhoeht.
  621. \def\Strich(#1,#2)#3{%
  622.   \c@whole=\@wholewidth\divide\c@whole by65536%
  623.   \c@half=\@halfwidth\divide\c@half by65536%
  624.   \c@dash=\d@dash\divide\c@dash by65536%
  625.   \c@tmp=\c@whole\advance\c@tmp by\c@whole%        c@tmp = 2*c@whole
  626.   \c@tmpa=#1\advance\c@tmpa by\c@tmp%
  627.   \c@tmpb=#2\advance\c@tmpb by\c@tmp%
  628.   \c@tmpc=#1\advance\c@tmpc by\c@whole%
  629.   \c@tmpd=#2\advance\c@tmpd by\c@whole%
  630.   \begin{picture}(\c@tmpa,\c@tmpb)%
  631.     \put(\c@half,\c@half){\dashbox{\c@dash}(\c@tmpc,\c@tmpd){#3}}%
  632.   \end{picture}%
  633.   \global\advance\d@breite by2\@wholewidth%
  634.   \global\advance\d@hoehe by2\@wholewidth%
  635. }
  636.  
  637.  
  638. %  Das \Kasten-Makro
  639. %  -----------------
  640. %  Mit diesem Makro wird mittels der \picture-Umgebung ein 3D-Kasten
  641. %  um das Bild gezeichnet  ==> \dashbox
  642. %  Parameter:
  643. %    #1,#2:    Breite und Hoehe in Punkten
  644. %    #3   :    Bildinhalt
  645. %  Die Breite und Hoehe des Bildes werden zuletzt um die Kastentiefe
  646. %  erhoeht.
  647. \def\Kasten(#1,#2)#3{%
  648.   \@wholewidth=0.4pt%
  649.   \c@boxl=\d@boxl\divide\c@boxl by65536\c@boxl=\the\c@boxl%
  650.   \c@tmpa=#1\advance\c@tmpa by\c@boxl%
  651.   \c@tmpb=#2\advance\c@tmpb by\c@boxl%
  652.   \c@tmp=#2%
  653.   \begin{picture}(\c@tmpa,\c@tmpb)%
  654.     \put(0,\c@boxl){\framebox(#1,#2){#3}}%
  655.     \put(\c@boxl,0){\line(-1,1){\c@boxl}}%
  656.     \put(\c@boxl,0){\line(1,0){#1}\line(-1,1){\c@boxl}}%
  657.     \put(\c@boxl,0){\put(#1,0){\line(0,1){\c@tmp}%
  658.      \put(0,\c@tmp){\line(-1,1){\c@boxl}}}}%
  659.   \end{picture}%
  660.   \global\advance\d@breite by\d@boxl%
  661.   \global\advance\d@hoehe by\d@boxl%
  662. }
  663.  
  664.  
  665.  
  666.  
  667. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  668.  
  669. \newbox\env@box%
  670. \newdimen\d@envdp
  671. \newcount\c@hsize
  672. \newcount\c@envdp
  673. \newdimen\d@envb
  674.  
  675. %  Die Umgebung FRAMEENV
  676. %  =====================
  677. %  Syntax:  \begin{frameenv}[Breite] ... \end{frameenv}
  678. %  Diese Umgebung umrahmt ihren Inhalt
  679. %
  680. %  Vorgehensweise:
  681. %    Die Textbreite (\textwidth) wird etwas verkleinert und der Umgebungs-
  682. %    inhalt in eine \vbox eingeschlossen. Dadurch erfolgt der Zeilenumbruch
  683. %    automatisch. Anschliessend wird die \vbox innerhalb einer
  684. %    'picture'-Umgebung in eine \framebox positioniert.
  685. %
  686. %  Zuerst wird die optionale 'Breite' abgefragt
  687. \long\def\frameenv{\@ifnextchar [{\@frameenv}{\@frameenv[\textwidth]}}
  688. \long\def\@frameenv[#1]{%
  689. %  \textwidth wird gerettet und anschliessend mit der 'Breite' initialisiert
  690.  \hsiz@=\textwidth  \textwidth=#1  \d@envb=#1
  691. %  Damit der Text (der Inhalt) nicht bis an die Umrahmung heranreicht, wird
  692. %  die \textwidth etwas verkleinert
  693.  \advance\textwidth by-2\@wholewidth
  694. %  \fboxsep (LaTeX-Befehl) enthaelt den Abstand zwischen Text und Umrahmung
  695.  \advance\textwidth by-2\fboxsep
  696.  \hsize=\textwidth   \linewidth=\textwidth
  697. %  Nun wird eine \vbox geoffnet, in die der Text geschrieben wird.
  698.  \setbox\env@box=\vbox\bgroup}%
  699. %
  700. \def\endframeenv{%
  701.  \egroup%   Die Box wird geschlossen und alle Werte wieder zurueckgesetzen
  702.  \hsize=\hsiz@    \textwidth=\hsiz@  \linewidth=\hsiz@
  703.  \c@breite=\d@envb   \divide\c@breite by65536
  704.  \advance\d@envb by-2\@wholewidth
  705.  \c@hsize=\d@envb  \divide\c@hsize by65536%    Breite der Box in Punkten
  706.  \d@envdp=\dp\env@box  \advance\d@envdp by\ht\env@box%
  707.  \advance\d@envdp by2\fboxsep%
  708.  \d@hoehe=\d@envdp   \advance\d@hoehe by2\@wholewidth
  709. %  Fuer die \picture-Umgebung werden alle Dimesionen in Punkte umgerechnet
  710.  \c@hoehe=\d@hoehe   \divide\c@hoehe by65536
  711.  \c@envdp=\d@envdp   \divide\c@envdp by65536%
  712.  \c@tmp=\@wholewidth \divide\c@tmp by65536
  713.  \vskip\@wholewidth%   Etwas vertikaler Abstand zum vorhergehenden Text
  714.  \unitlength 1pt\noindent%
  715.  \begin{picture}(\c@breite,\c@hoehe)(0,0)
  716.    \put(\c@tmp,\c@tmp){\framebox(\c@hsize,\c@envdp){\box\env@box}}
  717.  \end{picture}%
  718. }
  719.  
  720.  
  721.  
  722. % Die Umgebung SHADOWENV
  723. % ======================
  724. % Syntax:  \begin{shadowenv}[Breite] ... \end{shadowenv}
  725. % Diese Umgebung umrahmt und schattiert ihren Inhalt
  726. %
  727. %  Vorgehensweise:
  728. %    Die Textbreite (\textwidth) wird etwas verkleinert und der Umgebungs-
  729. %    inhalt in eine \vbox eingeschlossen. Dadurch erfolgt der Zeilenumbruch
  730. %    automatisch. Anschliessend wird die \vbox innerhalb einer
  731. %    'picture'-Umgebung in eine \framebox positioniert und der Schatten
  732. %    angehaengt.
  733. %
  734. % Zuerst wird die optionale 'Breite' abgefragt
  735. \long\def\shadowenv{\@ifnextchar [{\@shadowenv}{\@shadowenv[\textwidth]}}
  736. \long\def\@shadowenv[#1]{%
  737. %  \textwidth wird gerettet und anschliessend mit der 'Breite' initialisiert
  738.  \hsiz@=\textwidth  \textwidth=#1  \d@envb=#1
  739. %  Damit der Text (der Inhalt) nicht bis an die Umrahmung heranreicht, wird
  740. %  die \textwidth etwas verkleinert
  741.  \advance\textwidth by-2\@wholewidth
  742. %  \fboxsep (LaTeX-Befehl) enthaelt den Abstand zwischen Text und Umrahmung
  743.  \advance\textwidth by-2\fboxsep
  744.  \advance\textwidth by-\d@shad%    Korrektur um die Schattendicke
  745.  \hsize=\textwidth   \linewidth=\textwidth
  746. %  Nun wird eine \vbox geoffnet, in die der Text geschrieben wird.
  747.  \setbox\env@box=\vbox\bgroup}%
  748. %
  749. \def\endshadowenv{%
  750.  \egroup
  751.  \hsize=\hsiz@    \textwidth=\hsiz@  \linewidth=\hsiz@
  752.  \d@tmpa=\d@envb
  753.  \c@breite=\d@envb   \divide\c@breite by65536
  754.  \advance\d@envb by-2\@wholewidth  \advance\d@envb by-\d@shad
  755.  \c@hsize=\d@envb  \divide\c@hsize by65536%
  756.  \d@envdp=\dp\env@box  \advance\d@envdp by\ht\env@box%
  757.  \advance\d@envdp by2\fboxsep%
  758.  \c@envdp=\d@envdp   \divide\c@envdp by65536%
  759.  \d@hoehe=\d@envdp
  760. %  Umgebungshoehe := Texthoehe + 2*Strichdicke + Schattendicke
  761.  \advance\d@hoehe by2\@wholewidth  \advance\d@hoehe by\d@shad
  762. %  Umrechnen der Dimensionen in Counts fuer die \picture-Umgebung
  763.  \c@hoehe=\d@hoehe    \divide\c@hoehe by65536
  764.  \c@shad =\d@shad     \divide\c@shad  by65536
  765.  \c@tmp=\@wholewidth  \divide\c@tmp by65536
  766.  \advance\d@tmpa by-2\d@shad
  767.  \c@xoff =\d@tmpa     \divide\c@xoff by65536
  768.  \advance\c@xoff by\c@shad  \advance\c@xoff by-1
  769.  \advance\d@envdp by\@wholewidth
  770.  \vskip\@halfwidth
  771.  \unitlength 1pt\noindent%
  772.  \begin{picture}(\c@breite,\c@hoehe)(0,0)
  773.     \put(\c@tmp,\c@shad){\framebox(\c@hsize,\c@envdp){\box\env@box}}
  774.     \put(\c@shad,0){\rule{\d@tmpa}{\d@shad}}%    Horizontaler Schatten
  775.     \put(\c@xoff,0){\rule{\d@shad}{\d@envdp}}%    Vertikaler Schatten
  776.  \end{picture}%
  777.  \vskip\@halfwidth
  778. }
  779.  
  780.  
  781. % Die Umgebung DASHENV
  782. % ======================
  783. % Syntax:  \begin{dashenv}[Breite] ... \end{dashenv}
  784. % Diese Umgebung umrahmt ihren Inhalt gestrichelt.
  785. %
  786. %  Vorgehensweise:
  787. %    Die Textbreite (\textwidth) wird etwas verkleinert und der Umgebungs-
  788. %    inhalt in eine \vbox eingeschlossen. Dadurch erfolgt der Zeilenumbruch
  789. %    automatisch. Anschliessend wird die \vbox innerhalb einer
  790. %    'picture'-Umgebung in einer \dashbox positioniert
  791. %
  792. %  Zuerst wird die optionale 'Breite' abgefragt
  793. \long\def\dashenv{\@ifnextchar [{\@dashenv}{\@dashenv[\textwidth]}}
  794. \long\def\@dashenv[#1]{%
  795.  \hsiz@=\textwidth  \textwidth=#1  \d@envb=#1
  796.  \advance\textwidth by-2\@wholewidth  \advance\textwidth by-2\fboxsep
  797.  \hsize=\textwidth   \linewidth=\textwidth
  798.  \setbox\env@box=\vbox\bgroup}%
  799. %
  800. \long\def\enddashenv{%
  801.  \egroup
  802.  \hsize=\hsiz@    \textwidth=\hsiz@  \linewidth=\hsiz@
  803.  \c@breite=\d@envb   \divide\c@breite by65536
  804.  \advance\d@envb by-\@wholewidth
  805.  \c@hsize=\d@envb  \divide\c@hsize by65536%
  806.  \d@envdp=\dp\env@box  \advance\d@envdp by\ht\env@box%
  807.  \advance\d@envdp by2\fboxsep%
  808.  \advance\d@envdp by\@wholewidth
  809.  \d@hoehe=\d@envdp   \advance\d@hoehe by2\@wholewidth
  810.  \c@hoehe=\d@hoehe   \divide\c@hoehe by65536
  811.  \c@envdp=\d@envdp   \divide\c@envdp by65536%       Hoehe der Box in Punkten
  812.  \c@dash=\d@dash     \divide\c@dash  by65536%       Strichlaenge in Punkten
  813.  \c@whole=\@wholewidth    \divide\c@whole by65536
  814.  \c@half=\@halfwidth  \divide\c@half by 65536
  815.  \noindent\unitlength 1pt
  816.  \begin{picture}(\c@breite,\c@hoehe)(0,0)
  817.    \put(\c@half,\c@whole){\dashbox{\c@dash}(\c@hsize,\c@envdp){\box\env@box}}
  818.  \end{picture}%
  819. }
  820.  
  821.  
  822. % Die Umgebung OVALENV
  823. % ======================
  824. % Syntax:  \begin{ovalenv}[Breite] ... \end{ovalenv}
  825. % Diese Umgebung umrahmt ihren Inhalt mit abgerundeten Ecken.
  826. %
  827. %  Vorgehensweise:
  828. %    Die Textbreite (\textwidth) wird etwas verkleinert und der Umgebungs-
  829. %    inhalt in eine \vbox eingeschlossen. Dadurch erfolgt der Zeilenumbruch
  830. %    automatisch. Anschliessend wird die \vbox innerhalb einer
  831. %    'picture'-Umgebung in einem \oval positioniert.
  832. %
  833. %
  834. % Zuerst wird die optionale 'Breite' abgefragt
  835. \long\def\ovalenv{\@ifnextchar [{\@ovalenv}{\@ovalenv[\textwidth]}}%
  836. \long\def\@ovalenv[#1]{%
  837.  \hsiz@=\textwidth  \textwidth=#1  \d@envb=#1
  838. %  \fboxsep (LaTeX-Befehl) enthaelt den Abstand zwischen Text und Umrahmung
  839.  \advance\textwidth by-4\fboxsep
  840.  \hsize=\textwidth   \linewidth=\textwidth
  841.  \setbox\env@box=\vbox\bgroup}%
  842. %
  843. \long\def\endovalenv{%
  844.  \egroup
  845.  \hsize=\hsiz@    \textwidth=\hsiz@  \linewidth=\hsiz@
  846.  \@wholewidth=0.4pt
  847.  \c@breite=\d@envb   \divide\c@breite by65536
  848.  \advance\d@envb by-2\@wholewidth
  849.  \c@hsize=\d@envb  \divide\c@hsize by65536%    Breite des Ovals in Punkten
  850.  \d@envdp=\dp\env@box  \advance\d@envdp by\ht\env@box%
  851.  \advance\d@envdp by4\fboxsep%
  852.  \c@envdp=\d@envdp   \divide\c@envdp by65536%
  853.  \d@hoehe=\d@envdp   \advance\d@hoehe by2\@wholewidth
  854.  \c@hoehe=\d@hoehe   \divide\c@hoehe by65536
  855.  \c@tmpa=\c@hsize   \divide\c@tmpa by2%   Der Mittelpunkt des Ovals ist die
  856.  \c@tmpb=\c@envdp   \divide\c@tmpb by2%   Breite/Hoehe geteilt durch 2
  857.  \d@tmpa=2\fboxsep   \advance\d@tmpa by\@wholewidth
  858.  \c@xoff=\d@tmpa     \divide\c@xoff  by65536%
  859.  \advance\d@tmpa by\dp\env@box
  860.  \c@yoff=\d@tmpa     \divide\c@yoff  by65536%
  861.  \unitlength 1pt\noindent
  862.  \begin{picture}(\c@breite,\c@hoehe)(0,0)
  863.    \put(\c@tmpa,\c@tmpb){\oval(\c@hsize,\c@envdp)}
  864.    \put(\c@xoff,\c@yoff){\box\env@box}%
  865.  \end{picture}%
  866. }
  867.